perm filename A.FAI[VIS,HPM]1 blob sn#160940 filedate 1975-05-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00016 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	WIX2SB
C00005 00003	AR2TAB:	MOVEI	T,44			TOTAL BITS/WORD
C00007 00004	HAFPIC:	POP	P,RETAD
C00011 00005	GETPAR:	POP	P,RETAD
C00012 00006	PERBIT:	POP	P,RETAD
C00013 00007	HISTOG:	POP	P,RETAD
C00015 00008	ROWSUM:	POP	P,RETAD
C00016 00009	UNPACK:	POP	P,RETAD	 UNPACK A DENSE BYTE ARRAY INTO A PICTURE
C00017 00010	SELECT:	POP	P,RETAD	 copy a piece of a picture into another
C00019 00011	ROWSUD:	POP	P,RETAD			much quicker and dirtier than ROWSUM
C00020 00012	CMPPAR:	POP	P,RETAD
C00024 00013	COPPIC:	POP	P,RETAD			COPIES A PICTURE IN PIC1
C00025 00014	CORNR←←TEMP				THESE FOUR WORDS MUST
C00027 00015	X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
C00036 00016		END
C00037 ENDMK
C⊗;
	TITLE	WIX2SB

;FULLY FORMAT 2 ORIENTED PICTURE ROUTINES. EXTENSIONS TO THE CONVERTED
;FORMAT 1 ROUTINES IN WIXSUB
	
	ENTRY	HAFPIC,COPPIC,MATCH,GETPAR,PERBIT,HISTOG,CMPPAR,ROWSUM,ROWSUD
	ENTRY	UNPACK,SELECT

	INTERN	SQRS
CORGET:	0
CORREL:	0
	
	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BPTAB←←12
	LINTAB←←13

	T←1  ↔  TT←2  ↔  TTT←3  ↔  ARRY1←4  ↔  ARRY2←5  ↔  P←17
	A←6  ↔  B←7  ↔  C←10  ↔  D←11  ↔  E←13  ↔  F←14  ↔  G←15


RETAD:	0
TEMP:	BLOCK	25		;TEMPORARY STORAGE FOR STUFF

	FOR I←-77,-1,1 { I*4000000+I*I
				}
SQRS:	FOR I←0,77,1   { I*4000000+I*I
				}
AR2TAB:	MOVEI	T,44			;TOTAL BITS/WORD
	IDIV	T,BYBI(ARRY2)		;BYTE SIZE
	MOVEM	T,WDBY(ARRY2)		;BYTES PER WORD
	SUBI	TT,44			;-NUMBER OF USED BITS/WORD
	MOVNM	TT,WDBI(ARRY2)		;SAVED
	ADD	T,LNBY(ARRY2)
	SUBI	T,1
	IDIV	T,WDBY(ARRY2)		;NUMBER OF WORDS/SCANLINE
	MOVEM	T,LNWD(ARRY2)
	MOVE	TT,T	 		;WORDS/LINE
	IMUL	TT,WDBY(ARRY2)		;BYTES/WORD
	MOVEM	TT,LNBYA(ARRY2)		;GIVES BYTES/LINE, INCLUDING NULLS
	IMUL	TT,PCLN(ARRY2)
	MOVEM	TT,PCBYA(ARRY2)		;TOTAL BYTES/PIC, INCL. NULLS
	IMUL	T,PCLN(ARRY2)		;LINES IN THE PICTURE
	MOVEM	T,PCWD(ARRY2)		;WORDS IN THE PICTURE
	MOVE	T,LNBY(ARRY2)
	IMUL	T,PCLN(ARRY2)
	MOVEM	T,PCBY(ARRY2)		;BYTES/PIC, NOT INCL. NULLS
	MOVEI	T,14(ARRY2)
	ADD	T,PCLN(ARRY2)
	MOVEM	T,BPTAB(ARRY2)		;ADDRESS OF BYTE POINTER TABLE
	ADD	T,LNBYA(ARRY2)		;ADDR OF FIRST WORD IN PICTURE
	MOVN	TT,PCLN(ARRY2)		;SET UP CNTR FOR LINE ADDRESSES
	HRL	TT,TT
	HRRI	TT,LINTAB(ARRY2)
LTLP:	MOVEM	T,(TT)			;MAKE LINE TABLE
	ADD	T,LNWD(ARRY2)
	AOBJN	TT,LTLP
	MOVN	TT,BPTAB(ARRY2)
	HRL	TT,LNBYA(ARRY2)		;SET UP CNTR FOR BYTE TABLE
	AOBJN	TT,			;DECR ADDRESS AND INCR COUNT BY 1
	MOVN	TT,TT
	MOVEI	T,4400
	ADD	T,BYBI(ARRY2)
	LSH	T,6
	HRLZ	T,T
BYLP:	MOVEM	T,(TT)			;MAKE BYTE POINTER TABLE
	IBP	T
	AOBJN	TT,BYLP
	POPJ	P,
HAFPIC:	POP	P,RETAD
	POP	P,G	;MAXBIT
	POP	P,ARRY2			;MAKES A HALFSIZE VERSION
	POP	P,ARRY1			;OF A PICTURE
	MOVE	T,LNBY(ARRY1)		;HAFPIC(PICIN,PICOUT,BITMAX);
	ASH	T,-1			;NEW PIC IS HALF THE WIDTH
	MOVEM	T,LNBY(ARRY2)
	MOVE	T,PCLN(ARRY1)
	ASH	T,-1			;AND HALF THE HEIGHT
	MOVEM	T,PCLN(ARRY2)
	MOVE	T,BYBI(ARRY1)
	ADDI	T,2			;AND HAS TWO MORE BITS/PIXEL
	SUB	G,T			;UNLESS LIMITED TO LESS
        JUMPGE	G,.+2
        ADD	T,G
	MOVEM	T,BYBI(ARRY2)
	PUSHJ	P,AR2TAB		;SET UP ITS SKELETON
	MOVE	A,BPTAB(ARRY1)
	MOVE	A,-1(A)			;FIRST BYTE PNTR FOR ARRY1
	ADD	A,LINTAB(ARRY1)
	MOVE	B,BPTAB(ARRY2)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY2)
	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

		;IF NOT NEEDED TO REDUCE BITS/BYTE
	JUMPGE	G,[ LNLP: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
                          MOVE    C,A
                          ADD     A,LNWD(ARRY1)           ;BP S FOR ARRY1
                          MOVE    D,A
                          ADD     A,LNWD(ARRY1)
                          MOVE    E,B                     ;BP FOR ARRY2
                          ADD     B,LNWD(ARRY2)
                  CLLP:   ILDB    T,C                     ;FETCH FOUR BYTES AND ADD THEM
                          ILDB    TT,C
                          ADD     T,TT
                          ILDB    TT,D
                          ADD     T,TT
                          ILDB    TT,D
                          ADD     T,TT
                          IDPB    T,E                     ;THEN DEPOSIT SUM
                          SOJG    TTT,CLLP
                          SOJG    F,LNLP
                          JRST    @RETAD    ]

LNLP1:	MOVE	TTT,LNBY(ARRY2)		;NO OF BYTES, INNER LOOP CNTR
	MOVE	C,A
	ADD	A,LNWD(ARRY1)		;BP S FOR ARRY1
	MOVE	D,A
	ADD	A,LNWD(ARRY1)
	MOVE	E,B			;BP FOR ARRY2
	ADD	B,LNWD(ARRY2)
CLLP1:	ILDB	T,C			;FETCH FOUR BYTES AND ADD THEM
	ILDB	TT,C
	ADD	T,TT
	ILDB	TT,D
	ADD	T,TT
	ILDB	TT,D
	ADD	T,TT
	LSH	T,(G)			;TRUNCATE TO CORRECT # OF BITS
	IDPB	T,E			;THEN DEPOSIT SUM
	SOJG	TTT,CLLP1
	SOJG	F,LNLP1
	JRST	@RETAD
GETPAR:	POP	P,RETAD
	POP	P,ARRY2			;COPIES A FULL WORD ARRAY
	POP	P,ARRY1			;INTO A PICTURE

	MOVE	B,BPTAB(ARRY2)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY2)
	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

LNLPG:	MOVE	TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY2)
CLLPG:	MOVE    T,(ARRY1)               ;FETCH A WORD
	ADDI	ARRY1,1
	IDPB    T,E                     ;AND DEPOSIT A BYTE
	SOJG    TTT,CLLPG
	SOJG    F,LNLPG
	JRST    @RETAD
PERBIT:	POP	P,RETAD
	POP	P,ARRY2  ;transform	;TRANSFORMS EACH SAMPLE OF A
	POP	P,ARRY1	 ;picture	;PICTURE ACCORDING TO A TABLE

	HRRM	ARRY2,ARF

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPP:	MOVE	TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPP:	ILDB    T,E			;FETCH A SAMPLE
ARF:	MOVE	T,(T)			;altered to <ARRY2>(T)
	DPB	T,E                     ;AND DEPOSIT IT
	SOJG    TTT,CLLPP
	SOJG    F,LNLPP
	JRST    @RETAD
HISTOG:	POP	P,RETAD
	POP	P,ARRY2  ;HISTOGRAM	;MAKES A HISTOGRAM OF THE
	POP	P,ARRY1	 ;picture	;GREY LEVELS IN A PICTURE

	HRRM	ARRY2,ARFG
	HRRM	ARRY2,ARFH

	MOVEI	A,1
	LSH	A,@BYBI(ARRY1)
	SUBI	A,1
ARFH:	SETZM	(A)			;CLEAR THE ARRAY
	SOJGE	A,ARFH


	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPH:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPH:	ILDB    T,E			;FETCH A SAMPLE
ARFG:	AOS	(T)			;altered to <ARRY2>(T)
	SOJG    TTT,CLLPH
	SOJG    F,LNLPH
	JRST    @RETAD
ROWSUM:	POP	P,RETAD
	POP	P,ARRY2  ;ROW SUMS	;calculates the sum of each row of a pict
	POP	P,ARRY1	 ;picture

	HRRM	ARRY2,ARFS

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)

	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPS:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	SETZM	@ARFS
CLLPS:	ILDB    T,E			;FETCH A SAMPLE
ARFS:	ADDM	T,0			;altered to <ARRY2>(TTT)
	SOJG    TTT,CLLPS
	AOS	ARFS
	SOJG    F,LNLPS
	JRST    @RETAD
UNPACK:	POP	P,RETAD	; UNPACK A DENSE BYTE ARRAY INTO A PICTURE
	POP	P,ARRY1  ;destination picture
	POP	P,ARRY2	 ;original packed array

	MOVE 	C,BPTAB(ARRY1)
	ADD	ARRY2,-1(C)		;construct byte pntr for source array

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR destination
	ADD	B,LINTAB(ARRY1)

	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPU:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPU:	ILDB	T,C
	IDPB    T,E			;MOVE A SAMPLE
	SOJG    TTT,CLLPU
	SOJG    F,LNLPU
	JRST    @RETAD
SELECT:	POP	P,RETAD	 ;copy a piece of a picture into another
	POP	P,ARRY2  ;destination picture
	POP	P,B		;XEDGE
	POP	P,A		;YEDGE
	POP	P,ARRY1	 ;source picture, part of which is to be copied

	ADD	B,BPTAB(ARRY1)		;SYNTHESIZE BYTE POINTER
	MOVE	B,-1(B)			;FOR SOURCE ARRAY
	ADDI	A,LINTAB(ARRY1)
	ADD	B,(A)

	MOVE	A,BPTAB(ARRY2)
	MOVE	A,-1(A)			;AND FIRST BP FOR destination
	ADD	A,LINTAB(ARRY2)

	MOVE	D,BYBI(ARRY2)
	SUB	D,BYBI(ARRY1)

	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

LNLPL:	MOVE	TTT,LNBY(ARRY2) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	MOVE	C,A
	ADD	A,LNWD(ARRY2)
CLLPL:	ILDB	T,E
        LSH	T,(D)
	IDPB    T,C			;MOVE A SAMPLE
	SOJG    TTT,CLLPL
	SOJG    F,LNLPL
	JRST    @RETAD
ROWSUD:	POP	P,RETAD			;much quicker and dirtier than ROWSUM
	POP	P,ARRY2  ;ROW SUMS	;roughly calculates row sums
	POP	P,ARRY1	 ;picture

	SUBI	ARRY2,1

	MOVN	B,LNWD(ARRY1)

	MOVE	TTT,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPD:	HRL	TTT,B		 	;NO OF WORDS, INNER LOOP CNTR
	MOVEI	TT,0
CLLPD:	HLRZ    T,(TTT)			;FETCH A SAMPLE, SORT OF
	ADD	TT,T
	AOBJN   TTT,CLLPD
	PUSH	ARRY2,TT
	SOJG    F,LNLPD
	JRST    @RETAD
CMPPAR:	POP	P,RETAD
	POP	P,ARRY2  ;picture y	;compares two pictures
	POP	P,ARRY1	 ;picture x	;sigma(xi-yi)↑2/n

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;FIRST BP FOR ARRY1
	ADD	B,LINTAB(ARRY1)

	MOVE	C,BPTAB(ARRY2)
	MOVE	C,-1(C)			;AND FIRST BP FOR ARRY2
	ADD	C,LINTAB(ARRY2)

	MOVEI	A,0			;INITIALIZE SUM

	MOVE	G,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPC:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	MOVE	F,C
	ADD	C,LNWD(ARRY2)
CLLPC:	ILDB    T,E			;FETCH A SAMPLE
	ILDB	TT,F
	SUB	T,TT
	ADD	A,SQRS(T)		;and add (xi-yi)↑2 to A
	SOJG    TTT,CLLPC
	SOJG    G,LNLPC
	IDIV	A,PCLN(ARRY1)
	IDIV	A,LNBY(ARRY1)
	MOVE	1,A

	JRST    @RETAD
COPPIC:	POP	P,RETAD			;COPIES A PICTURE IN PIC1
	POP	P,ARRY2			;INTO PIC2 (THE LINE TABLE MUST
	POP	P,ARRY1			;BE ADJUSTED TO DO THIS)
	HRLZ	T,ARRY1			;  COPPIC(PIC1,PIC2)
	HRR	T,ARRY2
	MOVEI	TT,13(ARRY2)
	ADD	TT,PCLN(ARRY1)
	ADD	TT,LNBYA(ARRY1)
	ADD	TT,PCWD(ARRY1)
	BLT	T,(TT)
	MOVE	T,ARRY2
	SUB	T,ARRY1
	MOVN	TT,PCLN(ARRY1)
	SUBI	TT,1
	HRLZ	TT,TT
	HRRI	TT,BPTAB(ARRY2)
COPLP:	ADDM	T,(TT)
	AOBJN	TT,COPLP
	JRST	@RETAD
CORNR←←TEMP				;THESE FOUR WORDS MUST
HORIZ←←TEMP+1				;BE KEPT IN THIS ORDER
CENTR←←TEMP+2
VERTI←←TEMP+3
WHERTO: BYTE	(2)0,3,3,0,1,2,2,1,1,2,2,1,0,3,3,0
WHERPN:	POINT	2,WHERTO

VERCNT←←TEMP+4
HORCNT←←TEMP+5

FLAPIC:	POP	P,RETAD			;HIGH PASS FILTER WITH A CUTOFF
	POP	P,ARRY1			;1/FREQUENCY APPROIMATELY HALF THE
	SETZM	CORNR
	SETZM	HORIZ
	SETZM	VERTI
	SETZM	CENTR
	MOVE	T,PCLN(ARRY1)		;WIDTH AND HEIGHT OF THE PICTURE,
        MOVE	TT,T			;MAINLY TO REMOVE THE EFFECTS
	ASH	T,-2			;OF COS↑2 DARKENING AT THE EDGES
	MOVEM	T,VERCNT		;  FLAPIC(PICTURE)
      	MOVE	T,LNBY(ARRY1)
	ASH	T,-2			;THE LIMITS OF EACH GRID POINT
	MOVEM	T,HORCNT





X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
AX1←←TEMP ↔ AY1←←TEMP+1 ↔ AX2←←TEMP+2 ↔ AY2←←TEMP+3
BX1←←TEMP+4 ↔ BY1←←TEMP+5 ↔ BX2←←TEMP+6 ↔ BY2←←TEMP+7
SOUWIN←←TEMP+10 ↔ DESWIN←←TEMP+11 ↔ DEXSKP←←TEMP+12 ↔ DEYSKP←←TEMP+13
WSIZ1←←TEMP+14 ↔ DWSIZ←←TEMP+15 ↔ WSIZY1←←TEMP+16 ↔ VARIAN←←TEMP+17
SOUSIZ←←TEMP+20 ↔ WSIZ←←TEMP+21 ↔ DWSIZ←←TEMP+22

MATCH:	POP	P,RETAD
	POP	P,BX2		;A CORRELATOR. FINDS THE BEST MATCH
	POP	P,BY2		;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
	POP	P,BX1		;IN ARRY2(BX1:BY1,BX2:BY2)
	POP	P,BY1		;ALL ARGUMENT ARE BY REFERENCE. THE
	POP	P,ARRY2		;A'S AND B'S MAY BE ADJUSTED TO MAKE
	MOVE	X1,@BX1		;THINGS FIT
	MOVE	X2,@BX2		;   MATCH(PIC1,AX1,AY1,AX2,AY2,
	MOVE	Y1,@BY1		;         PIC2,BX1,BY1,BX2,BY2);
	MOVE	Y2,@BY2

FIXB:	CAMLE	X1,X2		;FIRST FIX UP THE LIMITS SO
	EXCH	X1,X2		;X1≤X2, X1≥0 X2<WIDTH ETC.
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY2)
	CAML	X2,T
	MOVEI	X2,-1(T)

	CAMLE	Y1,Y2		;SIMILAR FOR Y
	EXCH	Y1,Y2
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY2)
	CAML	Y2,T
	MOVEI	Y2,-1(T)

	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	FIXB

	MOVEM	X1,@BX1
	MOVEM	X2,@BX2
	MOVEM	Y1,@BY1
	MOVEM	Y2,@BY2

	POP	P,AX2		;DO SAME FOR SOURCE WINDOW
	POP	P,AY2
	POP	P,AX1
	POP	P,AY1
	POP	P,ARRY1
	MOVE	X1,@AX1
	MOVE	X2,@AX2
	MOVE	Y1,@AY1
	MOVE	Y2,@AY2

FIXA:	CAMLE	X1,X2		;FIRST FIX UP THE LIMITS SO
	EXCH	X1,X2		;X1≤X2, X1≥0 X2<WIDTH ETC.
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY1)
	CAML	X2,T
	MOVEI	X2,-1(T)

	CAMLE	Y1,Y2		;SIMILAR FOR Y
	EXCH	Y1,Y2
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY1)
	CAML	Y2,T
	MOVEI	Y2,-1(T)

	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	FIXA

	MOVE	T,@BX1		;SHRINK SOURCE WINDOW SYMMETRICALLY
	SUB	T,@BX2		;UNTIL IT IS NO
	ADD	T,X2		;LARGER THAN DESTINATION WINDOW
	SUB	T,X1	
	JUMPLE	T,YSHRNK
	MOVEI	TT,1(T)
	ASHC	T,-1
	ADDI	X1,(T)
	SUBI	X2,(TT)

YSHRNK:	MOVE	T,@BY1		;SHRINK IN Y DIRECTION
	SUB	T,@BY2		;UNTIL IT IS NO
	ADD	T,Y2		;LARGER THAN DESTINATION WINDOW
	SUB	T,Y1	
	JUMPLE	T,RESTA
	MOVEI	TT,1(T)
	ASHC	T,-1
	ADDI	Y1,(T)
	SUBI	Y2,(TT)

RESTA:	MOVEM	X1,@AX1
	MOVEM	Y1,@AY1
	MOVEM	X2,@AX2
	MOVEM	Y2,@AY2

THIS←←TT ↔ SIZ←←TTT

	MOVEI	SIZ,1(X2)	;CALCULATE SIZE OF BUFFER AREA
	SUB	SIZ,X1		;FOR THE SOURCE WINDOW CODE
	MOVEM	SIZ,WSIZ1	;WILL BE X WINDOWSIZE-1
	MOVEM	SIZ,WSIZ	;IS X WINDOWSIZ
	MOVNM	SIZ,DEXSKP	;WILL BE DELTA XB - DELTA XA
	MOVEI	T,1(Y2)
	SUB	T,Y1
	MOVEM	T,WSIZY1	;WILL BE X WINDOWSIZE-1
	MOVNM	T,DEYSKP	;WIL BE DELTA YB - DELTA YA
	IMUL	SIZ,T
	MOVEM	SIZ,SOUSIZ	;SOURCE WINDOW SIZE (IN PIXELS)
	ASH	SIZ,1
	ADDI	SIZ,1
	PUSHJ	P,CORGET	;AND MAKE THAT BUFFER
	HALT
	MOVEM	THIS,SOUWIN

	SUBI	THIS,1
	MOVN	T,T
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY1)	;Y COUNTER
	ADD	T,Y1

	MOVE	0,@BX2		;FINISH UP MAKING DELTA XB -DELTA XA
	SUB	0,@BX1
	ADDI	0,1
	MOVEM	0,DWSIZ
	ADDM	0,DEXSKP
	MOVE	0,@BY2		;AND THE Y'S TOO
	SUB	0,@BY1
	ADDI	0,1
	ADDM	0,DEYSKP
	SOS	WSIZ1		;NOT TO MENTION X WINDOWSIZ-1
	SOS	WSIZY1		;AND Y WINDOWSIZ-1

	MOVE	G,[MOVN TT,0(T)]

	MOVE	E,BPTAB(ARRY1)	;BP SKELETON
	ADDI	E,-1(X1)
	MOVE	E,(E)

	SETZB	B,A			;FOR SUM OF X AND X↑2, AS EXPLND BELOW
			;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP:	MOVE	F,E			;SETS UP IN LINE CODED
	ADD	F,(T)			;STUFF FOR THE INNER
	MOVE	TTT,WSIZ		;"LOOP" OF THE CORRELATION
ILXLP:	PUSH	THIS,G			;A SEQUENCE OF
	ADDI	G,1			; MOVN TT,POSB(T)
	ILDB	C,F			; ADD  A,SQRS+PIXEL(TT)
	ADD	B,C
	ADD	A,SQRS(C)
	ADD	C,[ADD	A,SQRS(TT)]
	PUSH	THIS,C
	SOJG	TTT,ILXLP
	ADD	G,DEXSKP
	AOBJN	T,ILYLP

	PUSH	THIS,[JRST INRDON]	;AND THE FINAL INSTR.
	
;CALCULATE SUM[(X-XBAR)↑2] ALSO. THIS IS SAME AS SUM[X↑2-2 X XBAR+XBAR↑2],
;WHICH IS SUM[X↑2]-2 XBAR SUM[X]+XBAR↑2*N OR, SINCE XBAR=SUM[X]/N,
;SUM[X↑2]-2(SUM[X])↑2/N+(SUM[X])↑2/N WHICH IS SUM[X↑2]-(SUM[X])↑2/N
; THIS QUANTITY WILL BE CALLED VARIANCE

	IMUL	B,B
	IDIV	B,SOUSIZ
	SUB	A,B
	MOVEM	A,VARIAN

	MOVE	X1,@BX1			;MAKE THE DESTINATION
	MOVE	X2,@BX2			;WINDOW BUFFER
	MOVE	Y1,@BY1
	MOVE	Y2,@BY2
	MOVEI	SIZ,1(X2)
	SUB	SIZ,X1
	MOVEM	SIZ,DWSIZ
	MOVEI	T,1(Y2)
	SUB	T,Y1
	IMUL	SIZ,T
	PUSHJ	P,CORGET
	HALT
	MOVEM	THIS,DESWIN

	SUBI	THIS,1
	MOVN	T,T			;Y COUNTER
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY2)
	ADD	T,Y1

	MOVE	E,BPTAB(ARRY2)		;BYTE POINTER SKELETON
	ADDI	E,-1(X1)		;FOR DESTINATION
	MOVE	E,(E)

BUYLP:	MOVE	F,E			;UNPACKS THE DESTINATION
	ADD	F,(T)			;WINDOW, ONE WORD/SAMPLE
	MOVE	TTT,DWSIZ
BUXLP:	ILDB	0,F
	PUSH	THIS,0
	SOJG	TTT,BUXLP
	AOBJN	T,BUYLP

	MOVN	B,DEXSKP		;NOW ACTUALLY CORRELATE
	SUBI	B,1

	HRLZI	D,377777		;VALUE OF BEST MATCH IN D
	MOVE	E,DESWIN		;LOCATION IN E
	MOVE	C,DEYSKP		;NUMBER OF ROWS
	MOVE	T,DESWIN		;WHERE TO START
CRYLP:	HRL	T,B			;INIT X CNTR, BUT KEEP OLD POSN
CRXLP:	MOVEI	A,0			;ACCUMULATE CURRENT SUM IN A
	JRST	@SOUWIN			;JUMP TO PREVIOUSLY CREATED CODE
INRDON: CAML	A,D			;SEE IN NEW SUM IS BETTER
	JRST	.+3
	MOVE	D,A			;IF SO, RECORD IT
	HRRZ	E,T
	AOBJN	T,CRXLP			;SHIFT IN X, AND TRY AGAIN
	ADD	T,WSIZ1			;ADD WHATS NEEDED TO GET TO NEXT
	SOJGE	C,CRYLP			;SCANLINE, AND TRY AGAIN

	SUB	E,DESWIN		;DECOMPOSE SAVED BEST LOCATION
	IDIV	E,DWSIZ			;INTO X AND Y PARTS
	ADDB	E,@BY1			;ACTUAL LOWER Y BOUND OF BEST MATCH
	ADDB	F,@BX1			;ACTUAL LOWER X BOUND OF BEST MATCH
	ADD	F,WSIZ1			;COMPUTE UPPER X BOUND
	MOVEM	F,@BX2			;AND RETURN IT
	ADD	E,WSIZY1		;UPPER Y BOUND
	MOVEM	E,@BY2			;RETURNED

	MOVE	THIS,SOUWIN		;RETURN THE USED CORAGE
	PUSHJ	P,CORREL
	MOVE	THIS,DESWIN
	PUSHJ	P,CORREL

	MOVE	1,D			;GET READY TO RETURN VALUE OF MATCH
	ASH	1,4			;SCALE IT UP BY 2↑4
	IDIV	1,VARIAN		;NORMALIZE
	JRST	@RETAD			;AND RETURN
	END